/**
 * 测试async和await
 * async 和 await就是Generator的语法糖
 * async 将 * 号换成了关键字
 * await 将 yield 换成了另外的英文
 */


// 这里我们假设很久之后5秒才会调用ok方法
// 将Promise对象的状态置为resolved
let plus1 = function () {
    let p = new Promise((ok, err) => {
        setTimeout(ok, 5000, 101, 201);
    });
    p.then((ok)=>{
        console.log("plus 1 ok=%s",ok);
    });
    return p;
};

// 抛出错误会被返回的Promise对象的reject方法接到
// plus2将会立刻返回
let plus2 = function () {
    return new Promise((ok, err) => {
        console.log("2+3=5");
        ok(5);
        return 5;
    })
};


// 现在我们换成asycn 和 await方式
// async内部的await是按照顺序执行的
// 第一个不执行完，后面的绝对不执行
// 所谓的执行完毕，是指Promise对象要么处于resolved状态，要么处于error状态
let afunc = async function () {
    console.log("async step 1");
    await plus1();
    console.log("async step 2");
    await plus2();
    console.log("async step 3");
    return 300;
}

// 会按照步骤执行 1 2 3
// 但是不会返回300
// var gen = afunc();

// 加入then后
// 可以获得300的返回值
// 这个返回值一定是所有await的Promise对象都是resolved（或者err）才能拿得到，如果任何一个error了
// 就会走err函数
afunc().then((ok) => {
    console.log("ok=%s", ok);
}, (err) => {
    console.log(err); // 打印err
});

// 这个早就执行过去了，不会最后执行的
console.log("main thread ended");